#ifndef KMYTEXTLAYER_H
#define KMYTEXTLAYER_H

#include "../KmyTypedef.h"
#include "KmyNode.h"
#include "../KmyFont.h"
#include "../KmyResourceManager.h"

typedef struct {
    int x;
    int y;
    int w;
    int h;
    int max_w;
}St_vrange;

typedef struct {
    int x;
    int y;
    int w;
    int h;
    int row;
}St_charrect;

class KmyTextLayer : public KmyNode
{
public:
    // 文本区宽，文本区高， 行高
    KmyTextLayer(int w, int h, int rowheight);
    virtual ~KmyTextLayer();

    void initialize();
    void finalize();

    int getNodeType();

    void logic();
    void render(KmyICanvas* screen);

    KmyITexture *tex;

    int width;
    int height;


    // 文本层缓冲区 RGBA4444
    u16 *data16;

    KmyFont* font;

    void clear();

    // 单色字体时用
    void setColor(u16 bone, u16 skin);
//    // 3色字体时用， 中间到外围
//    void setColorTable(u16 color1, u16 color2, u16 color3);

    /**
      * 外观效果
      */
     static const int OUTWARD_TYPE_NORMAL = 0;
     static const int OUTWARD_TYPE_SURROUND = 1;    //包边字
     static const int OUTWARD_TYPE_SHADOW = 2;      //带阴影

    /**
      * 设定外观效果
      */
    void setOutward(int type);
    /**
      * 设定文字显示速度
      */
    void setSpeed(int s);
    /**
     * return 实际画的字节数
     */
    int putUtf8String(const u8* str, int space, int height = 16);

    int putUcs2String(const u16 *str, int space, int height = 16);

    /**
      * 放入带注音的字符串 写作黑子读作变态什么的
      * str:    底部字（大）
      * phn:    顶部字（小）
      * space:  底部字最小间隔
      */
    void putUtf8Phonetic(const u8* main, const u8* phn, int space, int height1, int height2);
    void putUtf8Phonetic2(const u8* main, const u8* phn, int space, int height1, int height2);
    void putUcs2Phonetic(const u16* main, const u16* phn, int space, int height1, int height2);
    void putUcs2Phonetic2(const u16* main, const u16* phn, int space, int height1, int height2);

    void putUtf8Ruby(const u8* phn);
    /**
      * 获取末尾坐标
      */
    void getEndPosition(int &x, int &y);

    bool testPageChange_Utf8(const u8* str, int space, int height = 16);
    bool testPageChange_Ucs2(const u16 *str, int space, int height = 16);

    /**
      * 是否所有文字都显示完毕
      */
    bool isIdle();
    /**
      * 直接显示所有字符
      */
    void immediateOver();
private:
    // 纹理宽高（2的幂
    int width_p;
    int height_p;

    int pos_x;
    int row_height; // 字高+行间距
    int max_row;
    int cur_row;

    u16 color_bone;
    u16 color_skin;
    // 每行的字符显示范围，用来做字符缓慢出现特效
    St_vrange *view_ranges;

    St_charrect *cur_rect;
    KmyVector char_list;

    int outward;
    int speed;
    int delay;
    int* jumpy;

    // 超出宽度返回false
    bool putUcs2Char(u16 uc, int space, int height);

    int putUcs2String_1(const u16 *str, int space, int height = 16);
    int putUcs2String_2(const u16 *str, int posx, int posy, int space, int height);
    bool putUcs2Char_2(u16 uc, int &posx, int &posy, int height);

    /**
     * 返回 字符的字节数
     * ucs2code转换后的编码
     */
    int utf8ToUcs2(const u8* str, u16 &ucs2code);

    /**
      * 转换utf8字符串为ucs2字符串
      */
    u16* utf8ToUcs2Str(const u8 *str, int &length);

    /**
      * 获取字符串的字符数
      */
    int getUtf8StrLength(const u8 *str);
    int getUcs2StrLength(const u16 *str);

    /**
      * 获取字符串的显示宽度（标准大小 0间隔
      */
    int getUcs2StrWidth(const u16 *str, int space, int height);
//    int getUtf8StrWidth(const u8 *str);

    /**
      * new
      * 新画字方法
      */
    void drawCharResize2(u16 uc, int font_pix_width, int font_height, int posx, int posy, float size);


    int *bt;
};

#endif // KMYTEXTLAYER_H
